/*     */ package dm.sql;
/*     */ 
/*     */ import dm.jdbc.dataConvertion.Convertion;
/*     */ import dm.jdbc.dbaccess.DBError;
/*     */ import java.sql.SQLException;
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ public class DmdbIntervalYM
/*     */   implements Cloneable
/*     */ {
/*  31 */   private byte[] ym = new byte[12];
/*     */   
/*     */   public static final byte QUA_Y = 0;
/*     */   
/*     */   public static final byte QUA_YM = 1;
/*     */   
/*     */   public static final byte QUA_MO = 2;
/*     */   
/*  39 */   private int prec = 0;
/*  40 */   private boolean isPrecSet = false;
/*     */   
/*  42 */   public byte type = 0;
/*     */   
/*  44 */   public int years = 0;
/*     */   
/*  46 */   public int months = 0;
/*     */   
/*  48 */   private int precForSvr = 0;
/*     */   
/*     */   public final Object clone() {
/*  51 */     DmdbIntervalYM o = null;
/*     */     try {
/*  53 */       o = (DmdbIntervalYM)super.clone();
/*  54 */       if (this.ym != null)
/*  55 */         o.ym = ((byte[])this.ym.clone());
/*     */     } catch (CloneNotSupportedException e) {
/*  57 */       e.printStackTrace();
/*     */     }
/*  59 */     return o;
/*     */   }
/*     */   
/*     */   public DmdbIntervalYM(byte[] bs, int pre) {
/*  63 */     this.ym = bs;
/*  64 */     this.prec = pre;
/*  65 */     this.precForSvr = Convertion.getInt(this.ym, 8);
/*  66 */     this.type = this.ym[9];
/*  67 */     switch (this.type) {
/*     */     case 0: 
/*  69 */       this.years = getYear();
/*  70 */       break;
/*     */     case 1: 
/*  72 */       this.years = getYear();
/*  73 */       this.months = getMonth();
/*  74 */       break;
/*     */     case 2: 
/*  76 */       this.months = getMonth();
/*     */     }
/*     */   }
/*     */   
/*     */   public int hashCode()
/*     */   {
/*  82 */     return getYMString().hashCode();
/*     */   }
/*     */   
/*     */   public boolean equals(Object o) {
/*  86 */     if ((o != null) && ((o instanceof DmdbIntervalYM))) {
/*  87 */       DmdbIntervalYM tm = (DmdbIntervalYM)o;
/*     */       
/*  89 */       if (tm.type == this.type) {
/*  90 */         switch (this.type) {
/*     */         case 0: 
/*  92 */           if (this.years == tm.years)
/*  93 */             return true;
/*     */           break;
/*     */         case 1: 
/*  96 */           if ((this.years == tm.years) && (this.months == tm.months))
/*  97 */             return true;
/*     */           break;
/*     */         case 2: 
/* 100 */           if (this.months == tm.months) {
/* 101 */             return true;
/*     */           }
/*     */           break;
/*     */         }
/*     */         
/*     */       }
/*     */     }
/* 108 */     return false;
/*     */   }
/*     */   
/*     */   public DmdbIntervalYM(String str) throws SQLException {
/* 112 */     this.isPrecSet = false;
/* 113 */     parseIntervYMString(str);
/*     */   }
/*     */   
/*     */   public DmdbIntervalYM(String str, int pre) throws SQLException {
/* 117 */     this.isPrecSet = true;
/* 118 */     this.prec = pre;
/*     */     
/* 120 */     parseIntervYMString(str);
/*     */   }
/*     */   
/*     */   public final int getYear() {
/* 124 */     byte[] bs = new byte[4];
/* 125 */     System.arraycopy(this.ym, 0, bs, 0, 4);
/* 126 */     int y = Convertion.fourByteToInt(bs);
/* 127 */     return y;
/*     */   }
/*     */   
/*     */   public final int getMonth() {
/* 131 */     byte[] bs = new byte[4];
/* 132 */     System.arraycopy(this.ym, 4, bs, 0, 4);
/* 133 */     int mon = Convertion.fourByteToInt(bs);
/* 134 */     return mon;
/*     */   }
/*     */   
/*     */   public final byte getYMType() {
/* 138 */     return this.type;
/*     */   }
/*     */   
/*     */   public final int getLoadPrec() {
/* 142 */     return this.prec;
/*     */   }
/*     */   
/*     */   public final byte[] getByteArrayValue() {
/* 146 */     return this.ym;
/*     */   }
/*     */   
/*     */   public final int abs(int i) {
/* 150 */     if (i < 0) {
/* 151 */       i = -i;
/*     */     }
/* 153 */     return i;
/*     */   }
/*     */   
/*     */   public final String getYMString() {
/* 157 */     String str = "INTERVAL ";
/*     */     
/*     */ 
/*     */ 
/*     */ 
/* 162 */     switch (this.type)
/*     */     {
/*     */     case 0: 
/* 165 */       String year = String.valueOf(abs(this.years));
/*     */       
/* 167 */       if (this.years < 0) {
/* 168 */         str = str + "-";
/*     */       }
/* 170 */       if (this.prec > year.length()) {
/* 171 */         int len = year.length();
/* 172 */         int destLen = this.prec;
/*     */         
/* 174 */         while (destLen-- > len) {
/* 175 */           year = "0" + year;
/*     */         }
/*     */       }
/*     */       
/* 179 */       str = str + "'" + year + "' YEAR(" + this.prec + ")";
/* 180 */       break;
/*     */     
/*     */     case 1: 
/* 183 */       String year = String.valueOf(abs(this.years));
/* 184 */       String month = String.valueOf(abs(this.months));
/*     */       
/* 186 */       if ((this.years < 0) || (this.months < 0)) {
/* 187 */         str = str + "-";
/*     */       }
/* 189 */       if (this.prec > year.length()) {
/* 190 */         int len = year.length();
/* 191 */         int destLen = this.prec;
/*     */         
/* 193 */         while (destLen-- > len) {
/* 194 */           year = "0" + year;
/*     */         }
/*     */       }
/*     */       
/* 198 */       if (month.length() < 2) {
/* 199 */         month = "0" + month;
/*     */       }
/*     */       
/* 202 */       str = str + "'" + year + "-" + month + "' YEAR(" + this.prec + ") TO MONTH";
/* 203 */       break;
/*     */     
/*     */     case 2: 
/* 206 */       String month = String.valueOf(abs(this.months));
/*     */       
/* 208 */       if (this.months < 0) {
/* 209 */         str = str + "-";
/*     */       }
/* 211 */       if (this.prec > month.length()) {
/* 212 */         int len = month.length();
/* 213 */         int destLen = this.prec;
/*     */         
/* 215 */         while (destLen-- > len) {
/* 216 */           month = "0" + month;
/*     */         }
/*     */       }
/*     */       
/* 220 */       str = str + "'" + month + "' MONTH(" + this.prec + ")";
/*     */     }
/*     */     
/* 223 */     return str;
/*     */   }
/*     */   
/*     */   public final String toString() {
/* 227 */     return getYMString();
/*     */   }
/*     */   
/*     */   public byte[] convertStrToBs(int prec) throws SQLException {
/* 231 */     int leadPrec = prec >> 4 & 0xF;
/* 232 */     checkPrec(leadPrec);
/*     */     
/* 234 */     byte[] ym = new byte[12];
/* 235 */     System.arraycopy(Convertion.IntToByteArray(this.years), 0, ym, 0, 4);
/* 236 */     System.arraycopy(Convertion.IntToByteArray(this.months), 0, ym, 4, 4);
/* 237 */     System.arraycopy(Convertion.IntToByteArray(prec), 0, ym, 8, 4);
/* 238 */     return ym;
/*     */   }
/*     */   
/*     */   public void clear() {
/* 242 */     this.years = 0;
/* 243 */     this.months = 0;
/*     */   }
/*     */   
/*     */   private int getLeadPrec(String str, int startIndex) throws SQLException {
/* 247 */     if (this.isPrecSet) {
/* 248 */       return this.prec;
/*     */     }
/* 250 */     int leftBtId = -1;
/* 251 */     int rightBtId = -1;
/* 252 */     int leadPrec = 0;
/*     */     
/* 254 */     leftBtId = str.indexOf("(", startIndex);
/* 255 */     rightBtId = str.indexOf(")", startIndex);
/* 256 */     if ((rightBtId == -1) && (leftBtId == -1)) {
/* 257 */       leadPrec = 2;
/* 258 */     } else if ((rightBtId != -1) && (leftBtId != -1) && (rightBtId > leftBtId + 1)) {
/* 259 */       String strPrec = str.substring(leftBtId + 1, rightBtId).trim();
/* 260 */       leadPrec = Integer.parseInt(strPrec);
/*     */     } else {
/* 262 */       DBError.throwSQLException(6005);
/*     */     }
/* 264 */     return leadPrec;
/*     */   }
/*     */   
/*     */   private int[] getTimeValue(String subStr, int type) throws SQLException
/*     */   {
/* 269 */     boolean negative = false;
/* 270 */     if (subStr.startsWith("-")) {
/* 271 */       negative = true;
/* 272 */       subStr = subStr.substring(1);
/* 273 */     } else if (subStr.startsWith("+")) {
/* 274 */       negative = false;
/* 275 */       subStr = subStr.substring(1);
/*     */     }
/*     */     
/* 278 */     String tmpStr = subStr.substring(1, subStr.length() - 1).trim();
/* 279 */     int lastSignIndex = tmpStr.lastIndexOf("-");
/*     */     
/* 281 */     String[] list = new String[2];
/* 282 */     if ((lastSignIndex == -1) || (lastSignIndex == 0)) {
/* 283 */       list[0] = tmpStr;
/* 284 */       list[1] = "";
/*     */     } else {
/* 286 */       list[0] = tmpStr.substring(0, lastSignIndex);
/* 287 */       list[1] = tmpStr.substring(lastSignIndex + 1);
/*     */     }
/*     */     
/*     */     int yearVal;
/*     */     int monthVal;
/* 292 */     if (type == 1) {
/* 293 */       if (list[1].equalsIgnoreCase("")) {
/* 294 */         DBError.throwSQLException(6005);
/*     */       }
/* 296 */       int yearVal = Integer.parseInt(list[0]);
/* 297 */       int monthVal = Integer.parseInt(list[1]);
/*     */       
/* 299 */       if (negative) {
/* 300 */         yearVal *= -1;
/*     */       }
/* 302 */       if ((yearVal > Math.pow(10.0D, this.prec) - 1.0D) || 
/* 303 */         (yearVal < 1.0D - Math.pow(10.0D, this.prec)))
/* 304 */         DBError.throwSQLException(6005);
/* 305 */     } else if (type == 0) {
/* 306 */       int yearVal = Integer.parseInt(list[0]);
/* 307 */       int monthVal = 0;
/*     */       
/* 309 */       if (negative) {
/* 310 */         yearVal *= -1;
/*     */       }
/* 312 */       if ((yearVal > Math.pow(10.0D, this.prec) - 1.0D) || 
/* 313 */         (yearVal < 1.0D - Math.pow(10.0D, this.prec)))
/* 314 */         DBError.throwSQLException(6005);
/*     */     } else {
/* 316 */       yearVal = 0;
/* 317 */       monthVal = Integer.parseInt(list[0]);
/*     */       
/* 319 */       if (negative) {
/* 320 */         monthVal *= -1;
/*     */       }
/* 322 */       if ((monthVal > Math.pow(10.0D, this.prec) - 1.0D) || 
/* 323 */         (monthVal < 1.0D - Math.pow(10.0D, this.prec))) {
/* 324 */         DBError.throwSQLException(6005);
/*     */       }
/*     */     }
/* 327 */     int[] ret = new int[2];
/* 328 */     ret[0] = yearVal;
/* 329 */     ret[1] = monthVal;
/*     */     
/* 331 */     return ret;
/*     */   }
/*     */   
/*     */ 
/*     */   private void parseIntervYMString(String str)
/*     */     throws SQLException
/*     */   {
/* 338 */     if (str == null) {
/* 339 */       DBError.throwSQLException(6005);
/*     */     }
/* 341 */     str = str.toUpperCase();
/* 342 */     String[] ret = str.split(" ");
/* 343 */     int length = ret.length;
/* 344 */     if ((length < 3) || (!ret[0].equalsIgnoreCase("INTERVAL")) || (
/* 345 */       (!ret[2].startsWith("YEAR")) && (!ret[2].startsWith("MONTH")))) {
/* 346 */       DBError.throwSQLException(6005);
/*     */     }
/* 348 */     this.type = 1;
/* 349 */     int yearId = str.indexOf("YEAR");
/* 350 */     int monthId = str.indexOf("MONTH");
/* 351 */     int toId = str.indexOf("TO");
/*     */     
/* 353 */     if (toId == -1) {
/* 354 */       if ((yearId != -1) && (monthId == -1)) {
/* 355 */         this.type = 0;
/* 356 */         this.prec = getLeadPrec(str, yearId);
/* 357 */       } else if ((monthId != -1) && (yearId == -1)) {
/* 358 */         this.type = 2;
/* 359 */         this.prec = getLeadPrec(str, monthId);
/*     */       } else {
/* 361 */         DBError.throwSQLException(6005);
/*     */       }
/* 363 */     } else { if ((yearId == -1) || (monthId == -1)) {
/* 364 */         DBError.throwSQLException(6005);
/*     */       }
/* 366 */       this.type = 1;
/* 367 */       this.prec = getLeadPrec(str, yearId);
/*     */     }
/*     */     
/*     */ 
/* 371 */     this.precForSvr = ((this.type << 8) + (this.prec << 4) + 0);
/*     */     
/* 373 */     int[] timeVals = getTimeValue(ret[1], this.type);
/* 374 */     this.years = timeVals[0];
/* 375 */     this.months = timeVals[1];
/*     */     
/* 377 */     checkPrec(this.prec);
/*     */   }
/*     */   
/*     */   private void checkPrec(int prec) throws SQLException
/*     */   {
/* 382 */     switch (this.type) {
/*     */     case 0: 
/* 384 */       if (prec < String.valueOf(abs(this.years)).length()) {
/* 385 */         DBError.throwSQLException(6005);
/*     */       }
/* 387 */       break;
/*     */     
/*     */     case 1: 
/* 390 */       if (prec < String.valueOf(abs(this.years)).length()) {
/* 391 */         DBError.throwSQLException(6005);
/*     */       }
/* 393 */       if ((this.months < 1) || (this.months > 12)) {
/* 394 */         DBError.throwSQLException(6005);
/*     */       }
/* 396 */       break;
/*     */     
/*     */     case 2: 
/* 399 */       if (prec < String.valueOf(abs(this.months)).length()) {
/* 400 */         DBError.throwSQLException(6005);
/*     */       }
/*     */       break;
/*     */     }
/*     */   }
/*     */   
/*     */   public int getPrecForSvr()
/*     */   {
/* 408 */     return this.precForSvr;
/*     */   }
/*     */ }


/* Location:              D:\Program Files\DBMS_20150813\jdbc\Dm7JdbcDriver17.jar!\dm\sql\DmdbIntervalYM.class
 * Java compiler version: 2 (46.0)
 * JD-Core Version:       0.7.1
 */